home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xconq / ginit.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  10KB  |  300 lines

  1. /* Copyright (c) 1987, 1988  Stanley T. Shebs, University of Utah. */
  2. /* This program may be used, copied, modified, and redistributed freely */
  3. /* for noncommercial purposes, so long as this notice remains intact. */
  4.  
  5. #pragma comment(exestr, "@(#) ginit.c 12.1 95/05/09 ")
  6.  
  7. /* RCS $Header: ginit.c,v 1.2 88/07/15 14:56:16 shebs Exp $ */
  8.  
  9. /* Initialization and random routines for the display part of xconq. */
  10.  
  11. #include "config.h"
  12. #include "misc.h"
  13. #include "dir.h"
  14. #include "period.h"
  15. #include "side.h"
  16. #include "unit.h"
  17. #include "map.h"
  18. #include "global.h"
  19.  
  20. /* Always use four lines for the unit info display, even on small screens. */
  21.  
  22. #define INFOLINES 4
  23.  
  24. int maxnamelen = 0;        /* length of longest side name+host */
  25.  
  26. /* Find a unit and put it at center (or close to it) of first view.  I guess */
  27. /* can't use put_on_screen because not enough stuff is inited yet. */
  28.  
  29. init_curxy(side)
  30. Side *side;
  31. {
  32.     Unit *unit;
  33.  
  34.     for_all_units(unit) {
  35.     if (unit->side == side) {
  36.         side->cx = unit->x;  side->cy = unit->y;
  37.         side->vcx = unit->x;
  38.         side->vcy = max(unit->y, side->vw2+1);
  39.         side->vcy = min(side->vcy, (world.height-1) - side->vh2);
  40.         return;
  41.     }
  42.     }
  43.     side->vcx = side->vw2;  side->vcy = side->vh2;
  44.     side->cx = side->vcx;  side->cy = side->vcy;
  45. }
  46.  
  47. /* The very first step in using X is to open up all the desired displays. */
  48. /* In our case, there are many displays each with many windows.  If the */
  49. /* display opens successfully, do an initial "redraw" to set the screen up. */
  50.  
  51. init_displays()
  52. {
  53.     int len;
  54.     Side *side;
  55.  
  56.     for_all_sides(side) {
  57.     len = 8 + strlen(side->name) + 1;
  58.     maxnamelen = max(maxnamelen,
  59.              len + (side->host ? strlen(side->host) + 3 : 0));
  60.     }
  61.     for_all_sides(side) {
  62.     if (side->host != NULL) {
  63.         init_display(side);
  64.         if (active_display(side)) {
  65.         init_curxy(side);
  66.         redraw(side);
  67.         }
  68.     }
  69.     }
  70. }
  71.  
  72. /* Open display, create all the windows we'll need, do misc setup things, */
  73. /* and initialize some globals to out-of-range values for recognition later. */
  74.  
  75. init_display(side)
  76. Side *side;
  77. {
  78.     int i;
  79.  
  80.     if (Debug) printf("Will try to open display \"%s\" ...\n", side->host);
  81.  
  82.     if (!open_display(side)) {
  83.     fprintf(stderr, "Display \"%s\" could not be opened!\n", side->host);
  84.     exit_xconq();
  85.     }
  86.     active_display(side);   /* done for side effect */
  87.     init_colors(side);
  88.     init_misc(side);
  89.     init_sizes(side);
  90.     create_main_window(side);
  91.     side->msg =
  92.     create_window(side, 0, 0,
  93.               side->lw, side->nh * side->fh, NULL);
  94.     side->info =
  95.     create_window(side, 0, side->nh * side->fh + side->bd,
  96.               side->lw, INFOLINES * side->fh, NULL);
  97.     side->prompt =
  98.     create_window(side, 0, (side->nh + INFOLINES) * side->fh + 2*side->bd,
  99.               side->lw, side->fh, NULL);
  100.     side->map =
  101.     create_window(side, 0, side->th,
  102.               side->vw * side->hw,
  103.               side->vh * side->hch + (side->hh - side->hch),
  104.               side->split ? "xconq-map" : (char *) NULL);
  105.     side->sides =
  106.     create_window(side, side->lw + side->bd + 1, 0,
  107.               side->sw * side->fw, numsides * side->fh, NULL);
  108.     side->timemode =
  109.     create_window(side, side->lw + side->fw, side->th - 4 * side->fh,
  110.               2 * side->margin + 8 * side->fw, 2 * side->fh, NULL);
  111.     side->clock =
  112.     create_window(side, side->lw + 13 * side->fw, side->th - 2 * side->fh,
  113.               8 * side->fw, side->fh, NULL);
  114.     side->state =
  115.     create_window(side, side->lw + 1, side->th,
  116.               22 * side->fw, period.numutypes*max(side->hh, side->fh),
  117.               side->split ? "xconq-state" : (char *) NULL);
  118.     if (world_display(side)) {
  119.     side->world =
  120.         create_window(side,
  121.               side->lw+side->bd, side->mh-side->mm*world.height,
  122.               world.width * side->mm, world.height * side->mm,
  123.               side->split ? "xconq-world" : (char *) NULL);
  124.     }
  125.     create_help_window(side);
  126.     enable_input(side);
  127.     fixup_windows(side);
  128.     for (i = 0; i < MAXNOTES; ++i) strcpy(side->noticebuf[i], " ");
  129.     for (i = 0; i < MAXUTYPES; ++i) side->bvec[i] = 0;
  130.     /* Flag some values as uninitialized */
  131.     side->vcx = side->vcy = -1;
  132.     side->lastvcx = side->lastvcy = -1;
  133.     side->lastx = side->lasty = -1;
  134.     if (Debug) printf("Successfully opened \"%s\"!\n", side->host);
  135. }
  136.  
  137. /* Decide/compute all the sizes of things.  Our main problem here is that */
  138. /* the display might be smaller than we really desire, so things have to */
  139. /* be adjusted to fit. */
  140.  
  141. init_sizes(side)
  142. Side *side;
  143. {
  144.     int alw, abh;
  145.  
  146.     alw = (3 * display_width(side)) / 4;
  147.     if (side->vw == 0)
  148.         side->vw = min(world.width, alw / side->hw);
  149.     side->nw = min(BUFSIZE, alw / side->fw);
  150.     side->sw = maxnamelen;
  151.     abh = (2 * display_height(side)) / 3;
  152.     if (side->vh == 0)
  153.         side->vh = min(world.height, abh / side->hch);
  154.     if (side->nh == 0)
  155.         side->nh = max(1, min(abh/2 - 5, MAXNOTES));
  156.     side->mm = min(5, (max(world.width, side->fw*side->sw) / world.width));
  157.     set_sizes(side);
  158.     if (side->vw < MINWIDTH || side->vh < MINHEIGHT) {
  159.         fprintf(stderr, "Display \"%s\" is too small!\n", side->host);
  160.         exit_xconq();
  161.     }
  162. }
  163.  
  164. /* This fn is a "ten-line horror"; effectively a mini tiled window manager */
  165. /* that keeps the subwindows from overlapping no matter what the display and */
  166. /* requested sizes are.  Siemens eat your heart out... */
  167.  
  168. set_sizes(side)
  169. Side *side;
  170. {
  171.     int ulhgt, llhgt, urhgt, lrhgt;
  172.  
  173.     /* Make sure map window dimensions are OK */
  174.     side->vw = min(world.width, side->vw);
  175.     side->vh = min(world.height, side->vh);
  176.     side->vw2 = side->vw / 2;  side->vh2 = side->vh / 2;
  177.     /* Compute subregion sizes (left/right upper/lower width/height) */
  178.     if (side->split) {
  179.         side->lw = side->nw * side->fw;
  180.         side->rw = side->sw * side->fw;
  181.         lrhgt = 0;
  182.         llhgt = side->hh - side->hch;
  183.     }
  184.     else {
  185.     side->lw = max(side->nw * side->fw, side->hw * side->vw);
  186.     side->rw = max((world_display(side) ? world.width * side->mm : 0),
  187.            side->sw * side->fw);
  188.         lrhgt = period.numutypes * max(side->hh, side->fh);
  189.         if (world_display(side)) lrhgt += side->mm * world.height + side->bd;
  190.         llhgt = side->hch * side->vh + (side->hh - side->hch);
  191.     if (lrhgt > llhgt) {
  192.         side->vh = ((lrhgt - side->hh + side->hch) / side->hch);
  193.         side->vh = min(side->vh, world.height);
  194.         side->vh2 = side->vh / 2;
  195.         llhgt = side->hch * side->vh + (side->hh - side->hch);
  196.     }
  197.     }
  198.     urhgt = (numsides + 4) * side->fh + side->bd;
  199.     ulhgt = side->fh * (side->nh + INFOLINES + 1) + 3 * side->bd;
  200.     side->bh = max(llhgt, lrhgt);
  201.     /* adjust nh if screen is too small */
  202.     if ((side->bh + llhgt) >= display_height(side)) {
  203.     side->nh = (display_height(side) - side->bh - 3 * side->bd -
  204.             side->fh * (INFOLINES + 1) ) / side->fh;
  205.     side->nh = max(3, side->nh);
  206.     side->nh = min(MAXNOTES, side->nh);
  207.     ulhgt = side->fh * (side->nh + INFOLINES + 1) + 3 * side->bd;
  208.     }
  209.     side->th = max(ulhgt, urhgt);
  210.     side->mw = side->lw + side->bd + side->rw;
  211.     side->mh = side->th + side->bd + side->bh;
  212.     /* Only vcy needs adjustment, since vcx can never be close to an edge */
  213.     side->vcy = min(max(side->vh2, side->vcy), (world.height-1)-side->vh2);
  214. }
  215.  
  216. /* Acquire a set of colors.  There are too many to make it feasible to */
  217. /* customize them via .Xdefaults, so we don't even try.  If there aren't */
  218. /* enough colors, drop into monochrome mode.  This doesn't take the window */
  219. /* manager into account - it may have grabbed some color space. */
  220.  
  221. init_colors(side)
  222. Side *side;
  223. {
  224.     if (Debug) printf("%d colors available ...\n", display_colors(side));
  225.     side->monochrome = (display_colors(side) <= 2);
  226.     side->bonw = (side->monochrome ? BLACKONWHITE : FALSE);
  227.     set_colors(side);
  228. }
  229.  
  230. /* This will set up the correct set of colors at any point in the game. */
  231. /* Note that terrain colors get NO value if in monochrome mode. */
  232. /* If the colors requested are not available, it is up to the graphics */
  233. /* interface to supply a substitute. */
  234.  
  235. set_colors(side)
  236. Side *side;
  237. {
  238.     int    t;
  239.     long fg, bg;
  240.  
  241.     fg = (side->bonw ? black_color(side) : white_color(side));
  242.     bg = (side->bonw ? white_color(side) : black_color(side));
  243.     side->bgcolor = side->owncolor = side->altcolor = side->diffcolor = bg;
  244.     side->fgcolor = side->bdcolor = side->graycolor = side->enemycolor = fg;
  245.     side->neutcolor = side->goodcolor = side->badcolor = fg;
  246.     if (!side->monochrome) {
  247.     for_all_terrain_types(t) {
  248.         side->hexcolor[t] = request_color(side, ttypes[t].color);
  249.     }
  250.     side->owncolor = request_color(side, "black");
  251.     side->altcolor = request_color(side, "blue");
  252.     side->diffcolor = request_color(side, "maroon");
  253.     side->bdcolor = request_color(side, "blue");
  254.     side->graycolor = request_color(side, "light gray");
  255.     side->enemycolor = request_color(side, "red");
  256.     side->neutcolor = request_color(side, "light gray");
  257.     side->goodcolor = request_color(side, "green");
  258.     side->badcolor = request_color(side, "red");
  259.     }
  260. }
  261.  
  262. /* Move windows and change their sizes to correspond with the new sizes of */
  263. /* viewports, etc. */
  264.  
  265. reconfigure_display(side)
  266. Side *side;
  267. {
  268.     int sy, sdy;
  269.  
  270.     if (active_display(side)) {
  271.     set_sizes(side);
  272.     set_colors(side);
  273.     reset_misc(side);
  274.     sy = 0;  sdy = side->nh * side->fh;
  275.     change_window(side, side->msg, 0, sy, side->lw, sdy);
  276.     sy += sdy + side->bd;  sdy = INFOLINES * side->fh;
  277.     change_window(side, side->info, 0, sy, side->lw, sdy);
  278.     sy += sdy + side->bd;  sdy = 1 * side->fh;
  279.     change_window(side, side->prompt, 0, sy, side->lw, sdy);
  280.     change_window(side, side->map, side->split ? -1 : 0, side->th,
  281.               side->vw * side->hw,
  282.               side->vh * side->hch + (side->hh - side->hch));
  283.     change_window(side, side->timemode,
  284.               side->lw + side->fw, side->th - 4 * side->fh, -1, -1);
  285.     change_window(side, side->sides, side->lw+1, 0, -1, -1);
  286.     change_window(side, side->state,
  287.               (side->split) ? -1 : side->lw + 1, side->th,
  288.               20 * side->fw, period.numutypes*max(side->hh, side->fh));
  289.     if (world_display(side)) {
  290.         change_window(side, side->world, 
  291.               side->split ? -1 : side->lw + 1,
  292.               side->mh - world.height * side->mm,
  293.               world.width * side->mm, world.height * side->mm);
  294.     }
  295.     change_window(side, side->main, -1, -1, side->mw, side->mh);
  296.     redraw(side);
  297.     }
  298. }
  299.  
  300.